package cn.tedu.seri;

import java.io.*;

/*本类用于测试序列化与反序列化
 * 序列化:是指把程序中的Java对象,永久保存在磁盘中,相当于是写出的过程
 * 方向:out,用到的流是:ObjectOutputStream
 * 反序列化:是指把已经序列化在文件中保存的数据,读取/恢复到java程序中的过程
 * 方向:in,用到的流是:ObjectInputStream
 * */
public class TestSerializable {
    public static void main(String[] args) {
        method1();//本方法用于完成序列化的功能//序列化就是将java程序对象传入输入到磁盘文件
//        method2();//本方法用于完成反序列化的功能//将磁盘文件数据对象恢复读取到java程序里面
    }
    /*反序列化方法*/
    private static void method2() {
        //1.声明在本方法内都生效的局部变量,局部变量需要初始化,值为null
        ObjectInputStream in = null;
        //2.由于IO操作可能会产生异常,所以需要完成try-catch-finally结构
        try{
            //3.创建反序列化流对象
            //in = new ObjectInputStream(new FileInputStream("D:\\ready\\1.txt"));
            in = new ObjectInputStream(new FileInputStream(new File("D:\\ready\\11.txt")));

            //4.通过OIS反序列化读取对象
            System.out.println(in.readObject()); //字节码一个个输入进去,,,//return是Object,可以打印
            System.out.println("恭喜您!反序列化成功!");
        }catch (Exception e){
            System.out.println("很抱歉!反序列化失败!");
            e.printStackTrace();
        }finally {
            //5.关流
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /*序列化方法*/
    private static void method1() {
        //1.声明在本方法内都生效的局部变量,局部变量需要初始化,值为null
        ObjectOutputStream out = null;
        //2.由于IO操作可能会产生异常,所以需要完成try-catch-finally结构
        try{
            //3.创建序列化流对象
            out = new ObjectOutputStream(
                    new FileOutputStream("D:\\ready\\11.txt",true)); //可以追加输出序列化多个对象,但是只能反序列化一个对象
            //4.指定要序列化输出的对象
            Student objS = new Student("海绵宝宝",8,"大海里",'男');
//            Cat cat = new Cat();
            //5.通过OOS流对象来序列化输出Student对象
//            out.writeObject(cat);
            out.writeObject(objS);   // void: no return , can't be printed //对象输出流OUS的独有的方法, OutputStream没有,所以不能使用多态创建对象
//            System.out.println(out.writeObject(objS));
            System.out.println("恭喜您!序列化成功!");
        }catch (Exception e){
            System.out.println("很抱歉!序列化失败!");
            e.printStackTrace();
        }finally {
            //6.关流
            try {
                out.close();
            } /*catch (IOException e) {
                e.printStackTrace(); //控制台打印解决
            }*/ catch (IOException e) {
                throw new RuntimeException(e); //抛给方法解决
            }
        }
    }
}

